import sys
import pandas as pd
import os
import openpyxl

class FilesChecker(object):
    outer_sheet_name:str = "база"
    inner_sheet_name:str = "Отчет 1"
    def __init__(self) -> None:
        try:
            self.cur_path = sys._MEIPASS
        except:
            self.cur_path = os.path.dirname(os.path.realpath(__file__)) 
        self.outer_data:pd.DataFrame = None
        self.inner_data:pd.DataFrame = None
        self.data_ready:bool = False
        self.error_message = "Ошибок в файловой структуре нет, данные готовы для анализа"
        self.input_dir = f"{self.cur_path}\\input"
        self.output_dir = f"{self.cur_path}\\output"
        self.outer_file= None
        try:
            if not os.path.isdir(self.input_dir): os.mkdir(self.input_dir)
            if not os.path.isdir(self.output_dir): os.mkdir(self.output_dir) 
        except: raise
        
    def files_is_ready(self,filter:str=".xlsx")->bool:
        """Проверка на готовность файлов к анализу

        Args:
            filter (str, optional): Фильтр для файлов. Defaults to ".xlsx".

        Returns:
            bool: Готовность файлов
        """
        try:
            files = [f"{self.input_dir}\\{file_name}" for file_name in os.listdir(self.input_dir) if "~$" not in file_name and filter in file_name]
            if not files or files.__len__()!=2: raise Exception("Количество xlsx-файлов в папке 'input' должно быть 2.")
            for file in files:
                xl  = pd.ExcelFile(file)
                if self.outer_sheet_name in xl.sheet_names:
                    try:
                        self.outer_file = file
                        self.outer_data = pd.read_excel(file,self.outer_sheet_name)
                        self.outer_data = self.outer_data[["Покупатель"]]
                    except Exception as exp1: raise Exception(f"Ошибка в файле '{file}' : {exp1}")
                if self.inner_sheet_name in xl.sheet_names:
                    try:
                        self.inner_data = pd.read_excel(file,self.inner_sheet_name)
                        self.inner_data = self.inner_data[["Код клиента","Название клиента SAP","Полное название клиента SAP"]]
                    except Exception as exp2: raise Exception(f"Ошибка в файле '{file}' : {exp2}")
            if self.inner_data is not None and self.outer_data is not None: self.data_ready = True
            return self.data_ready                    
        except Exception as exp:
            self.data_ready = False
            self.error_message = f"Ошибка при проверке файлов: {exp}"
            return self.data_ready
    
    def norm(self,rec:pd.Series,cols:list[str]):
        old_rec = {}
        for col in cols: old_rec[f"{col} old"]=rec[col]
        rec = rec.str.strip().str.upper().str.replace('"','').str.replace('«','').str.replace('»','').str.replace(" - ","-")
        for key in old_rec.keys(): rec[key] = old_rec[key]
        rec = rec.apply(str)        
        # print(rec)
        return rec
        
    def analyze(self):
        try:

            self.outer_data = self.outer_data.apply(lambda rec: self.norm(rec,self.outer_data.columns.array.tolist()),axis=1)
            self.inner_data = self.inner_data.apply(lambda rec: self.norm(rec,self.inner_data.columns.array.tolist()),axis=1)
            self.outer_data = self.outer_data.drop_duplicates()
            self.inner_data = self.inner_data.drop_duplicates()
            print("Данные нормализованы")
            
            # self.outer_data.to_excel(f"{self.output_dir}\\outer1.xlsx",sheet_name="data",index=False)
            # self.inner_data.to_excel(f"{self.output_dir}\\inner1.xlsx",sheet_name="data",index=False)
            
            res = self.outer_data.merge(self.inner_data,right_on="Название клиента SAP",left_on="Покупатель",how="left")
            res = res.drop_duplicates()
            del_cols = [col for col in res.columns.array.tolist() if "old" not in col]
            res.drop(columns=del_cols,inplace=True)
            rename_map = {}
            for col in res.columns.array.tolist(): rename_map[col] = str(col).replace(" old","")
            res.rename(columns=rename_map,inplace=True)
            res.to_excel(f"{self.output_dir}\\result.xlsx",sheet_name="data",index=False)
            print("Карта кодов составлена")
            customer_map = {}
            for rec in res.to_dict("records"):
                customer_map[rec["Покупатель"]]=str(rec["Код клиента"])
            # print(customer_map)
            
            wb = openpyxl.open(self.outer_file,read_only=False)
            sheet = wb[self.outer_sheet_name]
            max_col = sheet.max_column
            max_row = sheet.max_row
            sap_col = 1
            customer_col = 1
            for i in range(1,max_col):
                if sheet.cell(1,i).value=="Код клиента SAP": sap_col = i
                if sheet.cell(1,i).value=="Покупатель": customer_col = i
            print(f"max_col: {max_col} max_row: {max_row} sap_col: {sap_col} customer_col: {customer_col}")
            for r in range(2,max_row+1):
                customer = sheet.cell(r,customer_col).value
                sheet.cell(r,sap_col,customer_map[customer])
            wb.save(f"{self.output_dir}\\ready.xlsx")                
            wb.close()
            print("Выходной файл готов")        
        except: raise
        